/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#if !defined(charsetmap_h)
#define charsetmap_h
typedef struct {
  const int cp;
  const char *name;
} CharsetMap;

static const CharsetMap mapper[] = {
  37,"IBM037",        437,"IBM437",         500,"IBM500",
  708,"ASMO-708",     720,"DOS-720",        737,"ibm737",
  775,"ibm775",       850,"ibm850",         852,"ibm852",
  855,"IBM855",       857,"ibm857",         858,"IBM00858",
  860,"IBM860",       861,"ibm861",         862,"DOS-862",
  863,"IBM863",       864,"IBM864",         865,"IBM865",
  866,"cp866",        869,"ibm869",         870,"IBM870",
  874,"windows-874",  875,"cp875",          932,"shift_jis",
  936,"GBK",          949,"ks_c_5601-1987", 950,"big5",
  1026,"IBM1026",     1047,"IBM01047",      1140,"IBM01140",
  1141,"IBM01141",    1142,"IBM01142",      1143,"IBM01143",
  1144,"IBM01144",    1145,"IBM01145",      1146,"IBM01146",
  1147,"IBM01147",    1148,"IBM01148",      1149,"IBM01149",
  1200,"utf-16",      1201,"unicodeFFFE",   1250,"windows-1250",
  1251,"windows-1251",                      1252,"windows-1252",
  1253,"windows-1253",                      1254,"windows-1254",
  1255,"windows-1255",                      1256,"windows-1256",
  1257,"windows-1257",                      1258,"windows-1258",
  1361,"Johab",       10000,"macintosh",    10001,"x-mac-japanese",
  10002,"x-mac-chinesetrad",                10003,"x-mac-korean",
  10004,"x-mac-arabic",                     10005,"x-mac-hebrew",
  10006,"x-mac-greek",                      10007,"x-mac-cyrillic",
  10008,"x-mac-chinesesimp",                10010,"x-mac-romanian",
  10017,"x-mac-ukrainian",                  10021,"x-mac-thai",
  10029,"x-mac-ce",                         10079,"x-mac-icelandic",
  10081,"x-mac-turkish",                    10082,"x-mac-croatian",
  12000,"utf-32",     12001,"utf-32BE",     20000,"x-Chinese_CNS",
  20001,"x-cp20001",  20002,"x_Chinese-Eten",
  20003,"x-cp20003",  20004,"x-cp20004",    20005,"x-cp20005",
  20105,"x-IA5",      20106,"x-IA5-German", 20107,"x-IA5-Swedish",
  20108,"x-IA5-Norwegian",20127,"us-ascii", 20261,"x-cp20261",
  20269,"x-cp20269",  20273,"IBM273",       20277,"IBM277",
  20278,"IBM278",     20280,"IBM280",       20284,"IBM284",
  20285,"IBM285",     20290,"IBM290",       20297,"IBM297",
  20420,"IBM420",     20423,"IBM423",       20424,"IBM424",
  20833,"x-EBCDIC-KoreanExtended",          20838,"IBM-Thai",
  20866,"koi8-r",     20871,"IBM871",       20880,"IBM880",
  20905,"IBM905",     20924,"IBM00924",     20932,"EUC-JP",
  20936,"x-cp20936",  20949,"x-cp20949",    21025,"cp1025",
  21866,"koi8-u",     28591,"iso-8859-1",   28592,"iso-8859-2",
  28593,"iso-8859-3", 28594,"iso-8859-4",   28595,"iso-8859-5",
  28596,"iso-8859-6", 28597,"iso-8859-7",   28598,"iso-8859-8",
  28599,"iso-8859-9", 28603,"iso-8859-13",  28605,"iso-8859-15",
  29001,"x-Europa",   38598,"iso-8859-8-i", 50220,"iso-2022-jp",
  50221,"csISO2022JP", 50222,"iso-2022-jp", 50225,"iso-2022-kr",
  50227,"x-cp50227",  50229,"cp50229",      50930,"cp50930",
  50931,"cp50229",    50933,"cp50933",      50935,"cp50935",
  50936,"cp50936",    50937,"cp50937",      50939,"cp50939",
  51932,"euc-jp",     51936,"EUC-CN",       51949,"euc-kr",
  51950,"cp51950",    52936,"hz-gb-2312",   54936,"GB18030",
  57002,"x-iscii-de", 57003,"x-iscii-be",   57004,"x-iscii-ta",
  57005,"x-iscii-te", 57006,"x-iscii-as",   57007,"x-iscii-or",
  57008,"x-iscii-ka", 57009,"x-iscii-ma",   57010,"x-iscii-gu",
  57011,"x-iscii-pa", 65000,"utf-7",        65001,"utf-8"
};

void getCharset(int cp, char *locale, const size_t size) {
  int begin, mid, end, cur;
  int len = sizeof(mapper) / sizeof(CharsetMap);
  if (cp < mapper[0].cp || cp > mapper[len -1].cp) {
    strcpy(locale, "windows-1252");
    return;
  }

  //searching
  begin = 0;
  end = len - 1;
  cur = -1;
  while (begin < end) {
    mid = (begin + end) / 2;
    if (mapper[mid].cp == cp) {
      cur = mid;
      break;
    }
    if (mapper[mid].cp < cp) {
      begin = mid + 1;
    } else {
      end = mid - 1;
    }
  }

  if (cur < 0) {
    // Not found
    strcpy(locale, "windows-1252");
  } else {
    if (strlen(mapper[cur].name) >= size) {
      strcpy(locale, "windows-1252");
    } else {
      strcpy(locale, mapper[cur].name);
    }
  }
  return;
}
#endif
